/*
    Unplugged: A library for creating plugins.
    Copyright (C) 2012  Hugo Arregui, FuDePAN

    Unplugged is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    Unplugged is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with Unplugged.  If not, see <http://www.gnu.org/licenses/>.

    This is a test file
*/

#include <gtest/gtest.h>
#include <gmock/gmock.h>

#define DL_TESTING
#include "unplugged/framework.h"
#include "unplugged/plugin.h"

using namespace Unplugged;
using namespace ::testing;

class FakePlugin : public Plugin
{
public:
    FakePlugin()
        : Plugin(NULL)
    {}
};

TEST(FrameworkTest, missing_plugin)
{
    mock = new DlMock();
    char error[] = "error";
    EXPECT_CALL(*mock, load_library(_)).WillOnce(ReturnNull());
    EXPECT_CALL(*mock, dlerror()).WillOnce(Return(error));
    ASSERT_THROW(load_plugin<Plugin>("test.so"), LibraryNotFound);
    delete mock;
}

TEST(FrameworkTest, missing_creation_function)
{
    mock = new DlMock();
    char error[] = "error";
    int* i = new int(1);
    EXPECT_CALL(*mock, load_library(_)).WillOnce(Return(i));
    EXPECT_CALL(*mock, find_symbol(_, _));
    EXPECT_CALL(*mock, unload_library(_));
    EXPECT_CALL(*mock, dlerror()).WillOnce(Return(error));
    ASSERT_THROW(load_plugin<Plugin>("test.so"), CreationFunctionNotFound);
    delete mock;
    delete i;
}
